视频理解论文串讲——上(跟着李沐学ai视频)笔记
深度学习应用于大部分场景下其实就是一个将人类可理解的具体事物转换为可被计算的特征,从而利用各种数学工具完成分类,检测,重构等任务。在图像领域,卷积操作自从Alex net网络架构提出后成为了提取图像特征的一般手段,而对于视频而言,也只是多帧图像组合在一起而已,很自然的能想到使用卷积对视频进行特征的提取,但由于多出了一个时序维度,这使得传统的2D卷积核在提取特征上出现了很多种方法能够进行实验,Deep Video网络架构率先对这个方向进行了探索,并给出了相关的实验结论

图1.Fusion的几种模式
图一中,这篇论文将视频中各帧图像的特征融合的方式称之为Fusion,并总结出了四种Fusion方法:
Single Frame,顾名思义就是只对单帧图片使用卷积进行编码(图一中由灰色框到彩色框过程),并在卷积层后接入一个MLP层完成分类任务。毫无疑问,这种方法并未利用时间信息,本质上就是单张图片识别,但这是一个baseline,奠定了主要的特征抽取方式
Late Fusion,在 Single Frame 的基础上随机间隔的抽取几帧,分别对这些图像帧进行卷积操作提取特征,之后将这些特征送了一个两层全连接层进行特征混合。这种方法使得时序上的特征信息能够在最后的全连接层进行一个交互,某种意义上利用了时序信息。
Early Fusion,该方法被称之为 Early ,那相对的对时序特征的融合操作做的就比较早了,它将连续的几帧图像帧在 channel 方向上拼起来,之后使用3d卷积核对这几帧图像提取特征,同样的,在最后送入全连接层进行分类等任务,举个具体的例子:比如三张存在rgb channels的图像拼起来,按照图像宽,高,channel数来划分x,y,z轴,则在z轴上有3*3,共9个矩阵,之后使用x*y*9的卷积核对这三张图像进行特征提取。
对于这种方法而言,在早期的卷积操作中就对特征进行了提取,本质上是一种3D卷积核的思想。
Slow Fusion,这种Fusion方式结合了Late Fsion与Eearly Fusion两种方法的操作,不仅在卷积阶段就对连续帧的图像进行了Fusion操作,并在经过若干卷积操作后就对特征再进行一次Fusion操作(Late Fusion),与真正的Late Fusion不同,Slow Fusion并没有选择直接将多帧特征直接接入MLP层,这是合理的,因为帧数较少时,MLP层的参数规模还在接受范围内,一旦帧数过多,那么参数规模将倍数增长,显然不适合用于长视频帧记忆
值得思考的是,上述几种模式从理论角度上而言,Slow Fusion的效果应该是最好的,但实际上这几种模式的效果大差不差,非要说的话,Slow Fusion的效果确实相对较好,但这几种模式居然都比不过手工提取特征,这是一件很费解的事情,单纯的三维卷积也许学不到时序特征?还是说对于时序特征,卷积的参数量已经不足以满足了?

图2.伪双流网络结构
论文中还提到一种特殊的网络架构,这个网络架构很有意思,既带着点注意力机制的感觉,又带着点后来的双流网络的雏形,我将它称之为为双流结构。
如图二,最上面的fovea stream(中央凹流),它将一整张图片扣下来最中间的一部分输入网络中,下面的context stream(上下文流)将整张图片送入网络,作者认为图像最中间总是包含着更多的信息,因此这个结构理应能够更加敏感的注意到视频的变化,从而提升网络性能。实际上网络也确实因为这个改动提升了,这更像是一个早期的注意力机制,只不过注意的范围永远在中间,相当于将中间的信息重复利用了。
上述论文做出的工作最好也只有65%左右的识别率,效果连手工提取特征都不如,但这篇文章将所有能直接应用的工作都做了一遍,是一个很棒的尝试。
Two-Stream
上文讲到,提出Deep Video的论文率先使用了一种伪双流结构对视频进行特征提取,而这篇论文算是正式提出了Two-Stream网络架构,这种网络试图从两个维度:时间-空间,对视频进行特征提取,其模型架构图如图:

图3.时空双流网络结构
- 时空双流网络架构是一个典型的Two-Stage的网络架构,在第一阶段,需要使用光流算法对视频提取光流图(论文在后面还讨论了怎么提取光流特征更好),在第二阶段,将一帧图片送入空间流,并将对应该帧的某一时间段内的几张光流图组成三维张量送入时间流,并应用
Deep Video中提出的Late Fusion思想,将特征送入MLP中学习一种分类的映射。
- 必须注意的是,虽然在我们理解中,这个网络学习了空间信息与时间信息,但实际上这个网络并没有学习真正意义上的时间信息,而是通过将视频转为光流图像的方式去让网络学习光流特征,从而间接学到时间特征
- 这个架构优秀的地方在于提出了独立学习特征的概念,某种意义上也算是启发了后来的多模态工作,并且该模型存在极大的改进空间,论文中直接使用的是Late Fusion,但从理论角度上来说Slow Fusion的性能更加优越。并且一旦引入Slow Fusion,两个独立工作的Stream就能在学习中互相交换信息,这更加符合我们人类的直觉
这篇文章主要在于提出了影响后续很久的双流网络架构,但这种架构理论上是能够提取小范围的时序特征,但是人的动作,或者一个事件的发生,动辄1-2s,长的更是达到3-5s,按照1s有30帧图像来算,即使使用抽帧技术,想要精确识别长动作或长事件,对时序流网络的参数量要求也是指数级的飙升,这也为后续工作提供了一个研究方向。
C3D——时间方向上也能移动的卷积核
上述提到的两种网络均基于2D卷积神经网络,Two-Stream架构使用2d卷积核捕捉空间信息和光流信息,Deep Video试图使用特征混合的方式用2d卷积核提取时间与空间信息,但毫无疑问的是这两种架构都没能真正的提取时间信息(Two-Stream看似提取了时间信息,但其实是学习了光流图信息,本质上是一个多模态输入),C3D论文很自然的提出2D卷积的无法提取,若是能够让卷积核在时间轴上移动,是否能够提取时间信息?

图4.2D卷积与3D卷积的区别
- 图4(a)中,单通道的2D卷积核在图像的宽高两个方向上进行移动,并最后输出一张2D特征图
- 图4(b)中,对于带有通道(RGB)的图像或视频,2D卷积也会多出一个维度将通道信息或时间轴信息一起卷起来,但是无一例外最后也是输出一张特征图。这里为了避免误导,特意说明:一般的卷积操作普遍被认为只会学习一种特征,因此对于一张图的卷积操作是同时有n个卷积核同时提取特征,每个特征都尽不相同,但是每个卷积核仍旧只是提取一张特征图,最后的输出是将n张卷积核提取的n张特征图堆叠起来,所以看起来像是2D卷积核提取出了一个3D张量的特征图。特此说明以防与图4(c)混淆。
- 图4(c)中,对于视频信息,使用一个k*k*d的3D卷积核,该卷积核不仅在图像帧的宽高方向移动,还会在时间轴上进行移动,并且对于一个卷积核而言,它的输出为一个3阶张量。
论文认为,2D卷积核之所以效果不够好,是因为2D卷积核把时间信息当作通道特征提取了,这应该是两种不同模态的特征,并且2D卷积核最后将特征输出为一张2D特征图,这对于时间特征来说是一种破坏,时间本应该描述为一种变化过程,但2D卷积将这种变化压缩降维到了一张图上,破坏了这种变化特征。而3D卷积核则没有这个问题,它并未折叠时间特征,而是将这种特征很好的保存了下来。作者的想法并未空穴来风,实际上该方法相较于其他使用2D卷积核的方法进步将近10个点,并且作者为这种方法做出了很好的解释:

图5.3D卷积卷了些什么
- 作者使用了
deconvolution的方法展示了3D卷积核里面的东西,可以看到,前几帧的图像中,卷积核被大幅度激活,捕获了图像的空间信息,之后的时间特征中,卷积核只对运动幅度较大的事件(体操动作)表现出了明显的激活现象,而对于运动幅度不大的事件(化妆)基本不激活
这篇论文还做了很多的消融实验,并且为3D卷积核为什么有用给出了极为详细的解释,包括3D卷积核映射出的特征的性质等,但是缺点也是很明显的:计算量取决于视频的长度,而回到了之前Two-Stream架构的问题,一秒就有30帧, 假设对一个长为5秒,大小为224224的视频进行计算,以3\3*3,stirde为1的3D卷积核为例,那么一次卷积操作就要移动223*223*1499次,而相同条件下的一次2D卷积核只需要移动223*223次,这是极大的计算量差距。短视频剪辑可以接受,长视频几乎是不可能完成的任务。
超越短时间的视频建模——引入LSTM的深度网络
前文说到,对于长时间视频建模而言,现有方法基本无法逃开计算量爆炸的问题,为了解决这个问题,本篇论文的作者顺势引入了LSTM网络解决这个问题。并在这篇文章中实验了Deep Video中提到的大部分fusion操作,实际验证了使用简单的max-pooling作为Early-fusion的手段,效果是最好的,当然个人认为有点无法解释,这可能变相说明了2D卷积的fusion操作无法在视频理解领域起到很好的作用。

图6.模型架构概览
- 接下来从两个方面对整体架构进行解读:
- 首先在视频预处理阶段,对视频进行抽帧处理,这里由于作者打算采用一种多模态的思想(一个网络流中同时输入图片数据与光流数据),可以接受原数据损失较大的动作信息(对应图中每个视频帧都不一样的表示),所以采用了一秒仅采样一帧的方法,而光流图作为对动作信息的补足,作者选取两个相邻帧(已被抽过帧)以15fps的采样速率从原始视频帧中采样并计算光流图(使用TV-L1算法,这里存疑,需要了解该算法),得到的光流图则当作视频图像特征送进卷积网络
这里作者提到一个预训练技巧,对光流图的卷积没必要重新训练,使用图像那边训练的好的卷积即可,这样能够加快模型的收敛速度,推测因为原始图像中的边缘信息有利于提取光流信息。原文还提到,一帧RGB图像对应横纵两个方向的光流图,因此可以补一个0通道矩阵给光流图,以满足在图像卷积模型上进行训练的要求。
- 其次Feature-Aggregation阶段,在这个阶段中,作者提出了两个方法,一个使用Feature-Pooling的方法,顾名思义就是用Pooling操作去进行时序方向上卷积特征的融合。另一个则是使用LSTM网络去aggregate时序信息
接下有关Feature-Pooling方法的几种形式不打算过多介绍,这几种方法的提升都很有限,并且无论叠了多少杂七杂八的层,最后效果最好的居然是最简单的conv-pooling方法,因此这里就简单介绍一下conv-pooling:

图7.Conv-Pooling(左一)
- 如图所示,模型将卷积特征输入一个max-pooling层,之后对特征做全连接操作。这个架构只有一个地方需要注意,那就是max-pooling的移动方向应该是时域方向,而非空间方向。有意思的是这个操作为什么有用,它甚至是所有作者尝试的操作中最有用的一个,甚至比LSTM都好!笔者想不到解释的原因吗,就不做过多猜想了。
接下来,作者将LSTM引入了视频领域,帮助科研界排除了LSTM这一选项(它的效果甚至不如简单的pooling操作,可以理解为时序信息在这里发生了严重的退化),具体过程如图:

图8. LSTM操作
- 图中的蓝色小方块代表一个LSTM神经元,这里每个神经元同时负责向上与向前传播的任务,这里的输入时卷积后的特征,这里的特征应该是拉平后输入的。
这篇论文的主要工作就是引入了LSTM与普通的Pooling操作,并且对比了这些工作的效果,最后的结论也是很意外的,LSTM并没有为网络带来质的改变,在nlp领域工作的很好的网络在视频领域工作得居然如此差劲,反而是简单的pooling操作能够融合更多的时序信息。这是一篇很好的试错文章,想使用LSTM在视频领域的兄弟们可以洗洗睡了,目前看效果并不好,这是一块并不好摘的果实,我们可能需要更优秀的特征编码技术才能引入LSTM。
使用Convolution Fusion的视频动作识别双流网络
本篇论文探索了关于Early fusion在双流网络结构中的应用,作者提出:双流网络的Late Fusion并不能很好的总结信息,这是因为对于一个动作时间而言,有些是能够根据空间信息(例如喝水,打球)是可以仅通过单帧图像就能识别的,但是对于另一些动作(例如说话,化妆,车辆行驶)等是需要空间与时间线索一起来确定,而双流网络的Late Fusion是在高语义阶段才做出融合操作,在低语义阶段并没有关注一些很明显的时间线索信息。这里补充语义特征的一点知识,目前学界广泛认为低级语义信息往往是一些很基础的诸如色彩,轮廓,线条等信息。而高级语义信息通常关注的是人类能够理解的图案(会丢失细节,丢失程度往往取决于低级语义信息)。
因此作者认为需要在低级语义阶段就让两个时空信息进行融合(Early Fusion),并且一个动作的时间信息与空间信息应该是高度相关的,应该尽可能逐像素的进行关联。
作者提出了4中fusion操作,并一一解释了它们为何能够有效,以下公式中,$x^a_{i,j,d}$表示$a$特征图,$i,j,d$分别表示特征图的长,宽以及通道数:
$y^{sum}_{i,j,d}=x_{i,j,d}^a+x_{i,j,d}^b$
- 简单来说就是把时空特征图逐像素,逐通道的加起来,通过学习参数得到一种时间与空间对应的计算关系
$y^{max}=max\{x_{i,j,d}^a, x^b_{i,j,d}\}$
- 这是一个类似max-pooling的机制,将特征图逐像素的对比,保留最大的特征值,这种方法可以说学习了一种时间与空间的价值性,学习了一种该特征点上空间重要就保留空间,时间重要就保留时间的机制
$y^{cat}_{i,j,2d}=f^{cat}(x^a,x^b)$
- 这种fusion一般与conv fusion混用,它简单的把特征在通道($d$)方向上堆叠起来,之后使用conv fusion提取特征
$y^{conv}=y^{cat}*f+b$
- 这里的 $f$ 是一次卷积操作,根据论文作者的实验,这种fusion的效果是最好的,这很好解释,已知卷积能够有效提取特征,那么这种方式理应是最好的才对
$y^{bil}=\sum^H_{i=1}\sum^W_{j=1}x_{i,j,d}^{aT}x^b_{i,j,d}$
- 这个操作将某个像素点上空间特征图的通道向量和时间特征图的通道向量做一个外积操作,并将其加权平均了一下。这个运算复杂度极高,事实上作者最后证明了这个操作的效率提升并不高只要做conv-pooling即可。
明确了这些fusion操作后,作者探索了两种做fusion操作的时机并给出了模型的整体框架图

图9. 模型框架探索
作者使用了VGG网络框架,在左图中,用两个网络架构进行特征图提取,于conv4层进行了一次时空特征图融合之后再用卷积提取一次高级语义特征后送入全连接层。在右图中,两个网络架构分别提取时间与光流特征,于conv5层进行了一次时空特征融合,不同的是空间网络流并没有消失,而是继续向前送入全连接层,在最后进行一次最后的融合输出分类信息。
从形式上看,左图就是由原来的双流网络进行一次fusion操作,之后接入了一次卷积网络,单纯从参数量上来评价网络性能的话,左图架构相比传统双流网络要少将近一半的参数。
而右图仍旧是一个完整的双流网络架构,并且因为中间的fusion操作,参数相比传统双流架构要更多一些。
右图相比左图而言,除了在参数量上有区别,更加注重保留空间上的高级语义信息,它不单在低级语义信息信息上进行了一次特征融合,在高级语义信息上又进行了一次融合。理所应当的,右图的性能表现要优于左图,事实上,根据原文中的表五数据来看,右图架构确实比左图架构要好将近一个点。
作者又认为,在时空融合后需要另外对时间流进行具体额外的处理,并且这种处理必须严格的考虑时序上的信息,因此作者对比了学界主流的几种时序特征的融合方式:

图10. 三种时序fusion操作
- (a)图很明显是完全没有利用时序信息
- (b)图将时序特征堆叠起来,使用3D-pooling操作进行特征聚合操作,这个操作将时序信息进行了一次增强
- (c)图使用了一次3D卷积提取特征,这里要注意(c)与(b)的差异,单纯的pooling操作一定是对已经提取好的特征做的,也就是输入数据包含了某种可解释的一致性。而卷积+pooing的操作是对存在非一致性的输入数据做的,换句话说,(c)是一个特征提取模块,这个模块具备捕捉时序信息的能力。
之后作者就结合以上讨论给出了最终的网络架构:

图11. 模型整体架构
该模型架构可以看作图9(左)中的扩展(这里我认为也可以看作是对图9(右)的改进),与之不同的是图9(左)中将两个特征流合并为一个特征流,少了一半的参数量,而该框架中注重时间流(依据为作者所做实验,对比之下注重时间流的效果更加优秀,这也是为什么我认为是对图9(右)的改进),接下来从三个模块阐明该架构:
在时空流阶段,网络分别提取光流特征与空间特征流,其中光流特征提取当前 $t$ 时刻的前后 $\frac L2$ 个时刻的光流图作为输入。在fusion阶段,采用上文说过的3D-conv-pooling操作,将两个不同信息的特征流Concatenate后提取为一个具有时空信息的特征流,之后使用3D-pooling操作增强特征
时空合并后阶段,时间特征流并未随着特征流的合并而消失,而是继续前进,在接入全连接层前使用3D-pooling减小特征数据量并同时增强特征数据
输出loss阶段,注意到时空流会输出一个Spatiotemporal-Loss,而单纯时序流会输出一个Temporal-Loss,为了使loss能够正常优化,作者对两个loss进行了加权平均后输出为一个loss
作者为双流网络构建了一种能够进行Early-fusion的架构,提出一种逐像素对应时间与空间关系的fusion方法,其中结合了3D-convolution与3D-Pooling操作,这种架构在没有显著增加参数量,使用两个基准数据集的情况下,超过了当时最好的技术。
研究表明了时间特征与空间特征在高度抽象的特征阶段(低级语义信息阶段)需要一一对应。此外作者还发现如果使用手工抽取的特征与卷积网络预测结合的话,也有类似改进效果,变相说明了这种时空特征意义对应的重要性.
作者在论文中设计了大量的消融实验,探索了应该在第几个卷积层实现这种fusion操作;应该增强空间特征流的提取还是增加时间特征流的提取,还是说都不增加,直接Late-fusion;各种fusion操作究竟哪个更好等等,上上下下的探索了整个双流网络,并大胆使用了3D卷积核与3D-Pooling操作,更有力证明了这种操作的有效性。
TSN——超级有效的视频分段建模
本篇论文提供了两个主要贡献点,其一是TSN(时间段分割网络),该架构可以实现长时间结构视频的建模,它结合了稀疏时间点采样与视频有监督训练,使得在视频动作识别上取得了良好效果。第二个贡献就是研究了于TSN帮助下在视频数据上学习卷积网络的一系列实践(就是帮忙排了雷)。
整个TSN分为四个阶段,接下来就从这四个阶段一一阐述该模型:

图12. TSN模型整体架构
第一阶段输入一个的视频,将视频分成几个大段,随后从每个分段中随机抽取一个短分段(其实就是一帧),抽出来帧将其转换为空间流(帧本身)与时间流(相应的光流图)作为下一阶段的输入
第二阶段为一个典型的双流网络,注意,这里每一帧对应双流网络的权值均为共享的,所以看似有很多,实质上只有一个。网络输出的就是分类的编码(独热编码等)
第三阶段是一个很有争议的阶段,它将上一阶段的分类结果输入两个一致性计算模块进行计算(空间流和空间流进行计算,时间流与时间流进行计算),但一致性计算的形式并不确定,作者给不出解释,反正他们把想到的加加减减,取平均等的聚合函数操作试了一下(这不是我瞎说的啊,作者原文就有这句话:The form of consensus function G remains an open question.),最后实验结果是取平均这种方法的效率更高点,倒也蛮符合直觉的,这里最后的输出也是一个分类的独热编码
第四阶段将两个一致性模块输出的分类编码综合考虑最后的预测,这里作者直接采用softmax函数。
这里试图解释一下这个分段的本质是什么,这里给出的数据集就是一个长时间的动作视频,分段其实就是一种稀疏采样的策略,采样得到的每个时期的帧都是属于这个动作的一部分,形式化讲的话,采样得到的样本都是属于同一个概率分布,稀疏采样更有利于模型全面了解整个概率分布。
另外,这个模型在训练时还有很多的细节可以讨论,作者也在接下来补充了很多训练时能用到的技巧:

图13. 几种视频帧的代替输入方案
作者提到对于单帧输入的图像往往缺乏上下帧的时间信息,普通光流图可能并不会把注意力放在运动的主要目标上(例如背景同时存在大量相对位移的情况下),作者找到了另外两种输入方式:RGB图像差分图,扭曲光流图。为了对比怎样的输入更优秀,做了几个消融实验,最终得出结论:这四种方法一起输入的效果是最好的,RGB差分图的效果较差,但比单纯出输入RGB要好。倒是不意外,这也意味着RGB差分图在实时应用领域能够代替计算量较大的光流图。
交叉模型训练,在预训练阶段中,作者利用RGB模型初始化光流模型(RGB模型可以通过其他分类模型预训练得到),其操作过程如下:
- 使用线性变换将光流图数值从0-1变换到0-255
- 利用RGB模型的第一层卷积层参数来初始化光流卷积网络第一层的卷积参数,但有一个问题,光流图像有两个channel(x方向与y方向),若依次输入10张光流图,那么就有20个channel,而一个RGB图像只有3个channel,如何将3个channel变成20个channel?作者直接将RGB三个channel的参数做了一下平均合成一个channel的参数,之后将这个channel复制20个当作光流网络的20个channel参数,效果异常优秀!
正则化技巧,这里讲的就是Batch-Normalization这个层的使用技巧了,这个层在使用好的情况下是可以很好的改进网络的性能,不好的情况下就会出各种问题。尤其在视频领域,由于数据集太小,因此会出现过拟合现象,作者提出Partial-BN的概念:
- 由于数据集较小,BN层微调会出现过拟合现象,那第一想法就是冻起来不调了,那这样迁移学习的效果的可能就不会太好。
- 作者认为,光流数据与RGB数据是不同模态的输入,数据的分布在一开始肯定是不同的,因此第一层的BN微调是有必要的(虽然我觉得后面也应该是不同的),所以作者就冻结了除第一层BN参数外的所有其它参数
- 同时,作者为了进一步防止过拟合,在每一层池化层后加入了一个额外的Dropout层
数据增强,作者提出了两种数据增强的方式:
- 角裁剪(corner cropping):仅从图片的边角或中心提取区域,来避免默认关注图片的中心
- 尺度抖动(scale jittering):将输入图像或者光流场的大小固定为 256×340,裁剪区域的宽和高随机从 {256,224,192,168} 中选择。最终,这些裁剪区域将会被resize到224×224 用于网络训练。事实上,这种方法不光包括了尺度抖动,还包括了宽高比抖动
本篇论文提出的TSN框架,将视频分段建模的思想很有用,视频种提到可以将这种思想用到对比学习(contrast learning)中
总结
本笔记涵盖了总共6篇在视频领域发挥代表性作用的论文,结合视频内容与自身理解进行记录,前前后后的整理花了大概10天时间,学到了不少东西,也明白了前辈们的工作是如何艰辛。
到目前为止,卷积网络的路似乎已经走到了尽头,Transfomer的崛起注定了卷积操作的落寞,但在Transfomer的应用中必定会出现不少与卷积网络相同的问题,相信研究前人的论文,一定能找到对应的解决方法。